package com.security.view.beans;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

import org.primefaces.context.RequestContext;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;

import com.archtecture.control.enums.Mensagem;
import com.archtecture.control.enums.Severidade;
import com.archtecture.control.exceptions.MensagemException;
import com.archtecture.control.facades.GenericPersistenceFacadeRemote;
import com.archtecture.view.beans.PadraoTelaAb;
import com.archtecture.view.utils.ParametroSessaoIF;
import com.archtecture.view.utils.UtilSession;
import com.archtecture.view.utils.UtilWeb;
import com.security.control.enums.TipoElementoVisual;
import com.security.control.facade.ManutencaoElementoVisualFacadeRemote;
import com.security.control.models.Aplicacao;
import com.security.control.models.ElementoVisual;
import com.security.view.utils.UtilSelectItens;

@ManagedBean
@ViewScoped
public class ElementoVisualMB extends PadraoTelaAb<ElementoVisual> {

	/**
	 * 
	 */
	private static final long						serialVersionUID	= -4465545021819214304L;

	@EJB
	private ManutencaoElementoVisualFacadeRemote	manutencaoElementoVisualFacade;

	@EJB
	private GenericPersistenceFacadeRemote			genericPersistenceFacade;

	private TreeNode								rootComp;

	private TreeNode								rootGrupo;

	private TreeNode								nodeTelaSelected;

	private TreeNode								nodeComponentSelected;

	private List<SelectItem>						selectItemGrupos;

	public ElementoVisualMB() {

	}

	public void alterarStatusElementoVisual(ElementoVisual model) {

		try {

			model.setFlComponenteEfetivo(!model.getFlComponenteEfetivo());
			genericPersistenceFacade.atualizar(model);
			UtilWeb.enviarMensagem(Severidade.INFO, Mensagem.MSG_SUCESSO_ATIVAR);

			if (TipoElementoVisual.COMPONENTE.equals(model.getTipoElementoVisual())) {
				setNodeComponentSelected(null);
				rootComp = null;
			}

			else {
				setNodeTelaSelected(null);
				rootGrupo = null;
			}

		} catch (MensagemException e) {
			UtilWeb.enviarMensagem(e);
		}
	}

	public void cancelar() {
		// TODO Auto-generated method stub

	}

	public void cancelarImportacao() {

		setEditando(false);
		rootComp = null;
		rootGrupo = null;
	}

	public void deletar() {

		ElementoVisual model = (ElementoVisual) getNodeTelaSelected().getData();

		try {
			genericPersistenceFacade.excluir(model);
		} catch (MensagemException e) {
			UtilWeb.enviarMensagem(e);
		}

		rootGrupo = null;
		setModel(null);
	}

	public void editar(ElementoVisual elemento) {

		setModel(elemento);
		RequestContext.getCurrentInstance().execute("elementDialog.show()");

	}

	private Aplicacao getAplicacao() {

		Aplicacao app = null;

		try {
			app = (Aplicacao) UtilSession.obterObjetoSessao(ParametroSessaoIF.SIGLA_APLICACAO);
		} catch (MensagemException e) {
			UtilWeb.enviarMensagem(e);
		}
		return app;
	}

	@Override
	public ElementoVisual getInstance() {
		ElementoVisual ev = new ElementoVisual();
		ev.setElementoVisualSuperior(new ElementoVisual());
		return ev;
	}

	/**
	 * @return the nodeComponentSelected
	 */
	public TreeNode getNodeComponentSelected() {
		return nodeComponentSelected;
	}

	/**
	 * @return the nodeTelaSelected
	 */
	public TreeNode getNodeTelaSelected() {
		return nodeTelaSelected;
	}

	public TreeNode getRootComp() {

		if (rootComp == null) {
			rootComp = new DefaultTreeNode("rootComp", null);
		}

		return rootComp;
	}

	public TreeNode getRootGrupo() {

		if (rootGrupo == null) {

			List<ElementoVisual> elementos = manutencaoElementoVisualFacade.buscarElementosVisualizacao(getAplicacao(),
					null, isEditando(), TipoElementoVisual.COMPONENTE);

			rootGrupo = new DefaultTreeNode("rootGroup", null);
			ordenarTreeNode(rootGrupo, elementos);

		}

		return rootGrupo;
	}

	/**
	 * Usado no popup
	 * 
	 * @return
	 */
	public List<SelectItem> getSelectItemGrupos() {

		// Grupos nao podem ter seus filhos como pai

		Aplicacao app = getAplicacao();

		ElementoVisual ev = new ElementoVisual();
		ev.setTipoElementoVisual(TipoElementoVisual.GRUPO);
		ev.setAplicacao(app);
		ev.setFlComponenteEfetivo(true);
		ev.setElementoVisualSuperior(new ElementoVisual());

		try {

			List<ElementoVisual> listElementos = genericPersistenceFacade.pesquisarLista(ev);

			if (getModel().getCodigo() != null) {

				if (listElementos.contains(getModel())) {
					listElementos.remove(getModel());
				}

			}
			selectItemGrupos = UtilSelectItens.getSelectItemGenerico(listElementos);

		} catch (MensagemException e) {
			UtilWeb.enviarMensagem(e);
			selectItemGrupos = new ArrayList<SelectItem>();
		}

		if (selectItemGrupos == null) {
			selectItemGrupos = new ArrayList<SelectItem>();
		}

		return selectItemGrupos;
	}

	public void importar() {

		setEditando(true);
		setNodeComponentSelected(null);
		setNodeTelaSelected(null);
		rootComp = null;
		rootGrupo = null;
	}

	public void incluirGrupo() {

		try {

			genericPersistenceFacade.inserir(getModel());

			new DefaultTreeNode(getModel().getTipoElementoVisual().name(), getModel(), getRootGrupo());

		} catch (MensagemException e) {
			UtilWeb.enviarMensagem(e);
		}

	}

	public void prepararInclusaoGrupo() {

		setModel(null);

		getModel().setAplicacao(getAplicacao());
		getModel().setTipoElementoVisual(TipoElementoVisual.GRUPO);
		getModel().setFlComponenteEfetivo(true);

		RequestContext.getCurrentInstance().execute("elementDialog.show()");
	}

	public void salvar() {

		try {

			if (getModel().getCodigo() == null) {
				genericPersistenceFacade.inserir(getModel());
			}

			else {
				genericPersistenceFacade.atualizar(getModel());
			}

			UtilWeb.enviarMensagem(Severidade.INFO, Mensagem.MSG_SUCESSO_EDITAR);
			RequestContext.getCurrentInstance().execute("elementDialog.hide()");

			// rootComp = null;
			rootGrupo = null;

		} catch (MensagemException e) {
			UtilWeb.enviarMensagem(e);
		}
	}

	/**
	 * @param nodeComponentSelected
	 *            the nodeComponentSelected to set
	 */
	public void setNodeComponentSelected(TreeNode nodeComponentSelected) {
		this.nodeComponentSelected = nodeComponentSelected;
	}

	/**
	 * @param nodeTelaSelected
	 *            the nodeTelaSelected to set
	 */
	public void setNodeTelaSelected(TreeNode nodeTelaSelected) {
		this.nodeTelaSelected = nodeTelaSelected;
	}

	public void visualizarCompontentes() {

		if (TipoElementoVisual.TELA.equals(((ElementoVisual) getNodeTelaSelected().getData()).getTipoElementoVisual())) {

			ElementoVisual tela = ((ElementoVisual) getNodeTelaSelected().getData());
			List<ElementoVisual> elementos = manutencaoElementoVisualFacade.buscarElementosVisualizacao(getAplicacao(),
					tela, isEditando(), TipoElementoVisual.GRUPO, TipoElementoVisual.TELA);

			ordenarTreeNode(getRootComp(), elementos);

			if (getRootComp().getChildCount() == 0) {
				UtilWeb.enviarMensagem(Severidade.WARN, Mensagem.WARN_VISUALIZACAO_COMPONENTES_SEM_RESULTADO);
			}

		} else {
			setNodeTelaSelected(null);
			UtilWeb.enviarMensagem(Severidade.WARN, Mensagem.WARN_VISUALIZACAO_COMPONENTES_GRUPO_NAO_SUPORTADA);
		}
	}

	private void ordenarTreeNode(TreeNode rootComp, List<ElementoVisual> elementos) {

		for (ElementoVisual elementoVisual : elementos) {
			TreeNode treeNode = new DefaultTreeNode(elementoVisual.getTipoElementoVisual().name(), elementoVisual,
					rootComp);

			if (elementoVisual.getElementosVisuais() != null && !elementoVisual.getElementosVisuais().isEmpty()) {
				ordenarTreeNode(treeNode, elementoVisual.getElementosVisuais());
			}
		}
	}

}
